#include<iostream>
#include<cstdio>
#include<stdarg.h>
#include"Log.hpp"

using namespace std;

//处理可变参数,通常需要使用头文件<cstdarg>宏va_start、va_arg、va_end
/*num是靠近可变参数最近的一个已知参数,栈是从高地址向低地址增长的(向下增长),
函数参数入栈是从右向左的*/
void Test1(int num, ...) 
{
    //va_list是一个类型,用于存储可变参数列表的信息
    va_list ap; 
    /*va_start初始化ap、使其指向第一个可变参数
    ap = &nums + sizeof(num); */
    va_start(ap, num); 
    while(num--) //循环遍历每个可变参数
    {
        /*va_arg获取下一个可变参数,并返回它的值
        data = *ap、ap += sizeof(int); */
        int data = va_arg(ap, int); 
        cout << data << ' ';
    }
    cout << endl;
    va_end(ap); //va_end清理va_list变量,释放任何可能分配的资源
}

void Test2(char* format, ...) 
{
    va_list ap;
    va_start(ap, format);
    char buffer[64];
    /*C标准库中的一个函数,用于将格式化后的字符串写入到缓冲区中,
    特别适用于处理包含可变参数列表的函数*/
    vsnprintf(buffer, 64, format, ap); //format为格式字符串,ap包含了可变参数列表
    cout << buffer << endl;
}

void Test3()
{
    // LogMessage(__FILE__, __LINE__, Debug, "helloworld: %s", "world");
    // LogMessage(__FILE__, __LINE__, Debug, "helloworld: %s, %d", "world", 10);
    // LogMessage(__FILE__, __LINE__, Debug, "helloworld: %s, %d, %.2f", "world", 10, 3.14);
    EnableFile(); 
    LOG(Debug, "helloworld");
    LOG(Info, "helloworld: %s, %d", "world", 10);
    LOG(Warning, "helloworld: %s, %d, %.2f", "world", 10, 3.14);
}

int main()
{
    //Test1(6, 1, 2, 3, 4, 5, 6);
    Test2((char*)"hello:%d, world:%d", 10, 6);
    //Test3();
    
    return 0;
}